#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <sw/redis++/redis++.h>

using namespace sw::redis;

void test_1(Redis &redis)
{
    redis.flushall();
    redis.sadd("key", "1");
    redis.sadd("key", {"2", "3"});
    std::vector<std::string> vec{"4", "5"};
    redis.sadd("key", vec.begin(), vec.end());

    bool ans = redis.sismember("key", "3");
    if (ans)
        std::cout << "is member" << std::endl;
    else
        std::cout << "not member" << std::endl;

    auto iter = std::inserter(vec, vec.end());
    redis.smembers("key", iter);

    for (auto e : vec)
        std::cout << e << " ";
    std::cout << std::endl;
}

void test_2(Redis &redis)
{
    redis.flushall();
    redis.sadd("key", "1");
    redis.sadd("key", {"2", "3"});

    auto ans = redis.spop("key");
    if (ans)
        std::cout << ans.value() << std::endl;
    else
        std::cout << "set is empty" << std::endl;

    long long res = redis.scard("key");
    std::cout << res << std::endl;
}

void test_3(Redis &redis)
{
    redis.flushall();
    redis.sadd("key", "1");
    redis.sadd("key", {"2", "3"});

    redis.sadd("key1", {"1", "2", "4"});
    
    std::vector<std::string> vec;
    auto iter = std::back_inserter(vec);
    redis.sinter({"key", "key1"}, iter);

    for(auto e : vec)
        std::cout << e << " ";
    std::cout << std::endl;

}

void test_4(Redis &redis)
{
    redis.flushall();
    redis.sadd("key", "1");
    redis.sadd("key", {"2", "3"});

    redis.sadd("key1", {"1", "2", "4"});
    
    long long n = redis.sinterstore("key2", {"key", "key1"});
    std::cout << n << std::endl;
    
    std::vector<std::string> vec;
    auto iter = std::back_inserter(vec);
    redis.smembers("key2", iter);
    for(auto e : vec)
        std::cout << e << " ";
    std::cout << std::endl;
}

int main()
{
    Redis redis("tcp://127.0.0.1:6379");
    // test_1(redis);
    // test_2(redis);
    //  test_3(redis);
    test_4(redis);
    return 0;
}
